package com.nowcoder.community.config;

import com.nowcoder.community.quartz.AlphaJob;
import com.nowcoder.community.quartz.PostScoreRefreshJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;

// 配置 -> 数据库 -> 调用
// Quartz 三大件 ： 任务 -> 任务的详情 -> 触发器
@Configuration
public class QuartzConfig {

    // BeanFactory -> 是IOC容器的顶层接口

    // FactoryBean -> FactoryBean可以简化Bean的实例化过程：
    // 1.通过FactoryBean封装了某一些Bean的实例化过程
    // 2.可以将FactoryBean装到Spring容器里
    // 3.将FactoryBean注入给其他的Bean
    // 4.改Bean得到的是FactoryBean所管理的对象实例

    // 配置JobDetail
    // @Bean
    public JobDetailFactoryBean alphaJobDetail(){
        // job的JobDetailFactoryBean
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        // 管理的job类
        factoryBean.setJobClass(AlphaJob.class);
        // 声明的job的名字(不可重名)
        factoryBean.setName("alphaJob");
        // 任务的分组
        factoryBean.setGroup("alphaJobGroup");
        // 任务是否长久保存: 任务将来已经没有了，哪怕连触发器都没有了也一直存着
        factoryBean.setDurability(true);
        // 任务是否是可恢复的
        factoryBean.setRequestsRecovery(true);
        return factoryBean;
    }

    // 配置Trigger(SimpleTriggerFactoryBean,CronTriggerFactoryBean)
    // SimpleTriggerFactoryBean -> 简单的Trigger，比如每10分钟执行一次
    // CronTriggerFactoryBean -> 复杂的Trigger，比如每个月半夜最后一天两点
    // 读取JobDetail
    // 得到JobDetailFactoryBean所管理的JobDetail
    // @Bean
    public SimpleTriggerFactoryBean alphaTrigger(JobDetail alphaJobDetail){
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        // 根据Bean的名字注入
        factoryBean.setJobDetail(alphaJobDetail);
        // alphaTrigger -> trigger的名字
        factoryBean.setName("alphaTrigger");
        // alphaTriggerGroup -> trigger的分组
        factoryBean.setGroup("alphaTriggerGroup");
        // repeatInterval -> 执行频率
        factoryBean.setRepeatInterval(3000);
        // JobDataMap -> trigger的底层要存储一些Job的状态，JobDataMap是一个默认类型
        factoryBean.setJobDataMap(new JobDataMap());
        return factoryBean;
    }

    // 配置JobDetailFactoryBean
    @Bean
    public JobDetailFactoryBean postScoreRefreshDetail(){
        // job的JobDetailFactoryBean
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        // 管理的job类
        factoryBean.setJobClass(PostScoreRefreshJob.class);
        // 声明的job的名字(不可重名)
        factoryBean.setName("postScoreRefresh");
        // 任务的分组
        factoryBean.setGroup("communityGroup");
        // 任务是否长久保存: 任务将来已经没有了，哪怕连触发器都没有了也一直存着
        factoryBean.setDurability(true);
        // 任务是否是可恢复的
        factoryBean.setRequestsRecovery(true);
        return factoryBean;
    }

    // 配置SimpleTriggerFactoryBean
     @Bean
    public SimpleTriggerFactoryBean postScoreRefreshTrigger(JobDetail postScoreRefreshDetail){
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        // 根据Bean的名字注入
        factoryBean.setJobDetail(postScoreRefreshDetail);
        // alphaTrigger -> trigger的名字
        factoryBean.setName("postScoreRefreshTrigger");
        // alphaTriggerGroup -> trigger的分组
        factoryBean.setGroup("communityTriggerGroup");
        // repeatInterval -> 执行频率 ms 每五分钟执行一次
        factoryBean.setRepeatInterval(1000*60*5);
        // JobDataMap -> trigger的底层要存储一些Job的状态，JobDataMap是一个默认类型
        factoryBean.setJobDataMap(new JobDataMap());
        return factoryBean;
    }


}
